package modelo.servicio;

import java.util.List;
import modelo.bd.dao.EventoDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Evento;

public class Eventos {

    private static Eventos instancia;
    private EventoDAO dao;

    private Eventos() {
        this.dao = new EventoDAO();
    }

    public static Eventos instancia() {
        if (instancia == null) {
            instancia = new Eventos();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Pasos.");
    }

    public void agregar(String claveFlujo, String clavePaso, String claveEvento, String descripcion, String descripcionCorta,
            String tipoAprobacion, long aprobadores, boolean validaForzosos, 
            boolean causable, String tipoCausa, String clavePasoSig, String clavePasoSigMonto, 
            String usuario) throws DAOException {
        Evento evento = new Evento(claveEvento.replace("'", "''"), descripcion.replace("'", "''"), descripcionCorta, 
                tipoAprobacion, aprobadores, validaForzosos, causable, tipoCausa);
        evento.setOrigen(Pasos.instancia().porClave(claveFlujo, clavePaso));
        evento.setSiguiente(Pasos.instancia().porClave(claveFlujo, clavePasoSig));
        if (tipoAprobacion.equalsIgnoreCase("T")) {
            evento.setAprobadores(0);
        } else if (tipoAprobacion.equalsIgnoreCase("U")) {
            evento.setAprobadores(1);
        }
        if (evento.getOrigen().getFlujo().isValidaMonto()) {
            evento.setSiguienteMonto(Pasos.instancia().porClave(claveFlujo, clavePasoSigMonto));
        }
        if (descripcionCorta != null) {
            evento.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        dao.add(evento, usuario);
    }

    public void editar(String claveFlujo, String clavePaso, String claveEvento, String descripcion, String descripcionCorta,
            String tipoAprobacion, long aprobadores, boolean validaForzosos, 
            boolean causable, String tipoCausa, String clavePasoSig, String clavePasoSigMonto,
            String usuario) throws DAOException {
        Evento evento = new Evento(claveEvento.replace("'", "''"), descripcion.replace("'", "''"), descripcionCorta, 
                tipoAprobacion, aprobadores, validaForzosos, causable, tipoCausa);
        evento.setOrigen(Pasos.instancia().porClave(claveFlujo, clavePaso));
        evento.setSiguiente(Pasos.instancia().porClave(claveFlujo, clavePasoSig));
        if (tipoAprobacion.equalsIgnoreCase("T")) {
            evento.setAprobadores(0);
        } else if (tipoAprobacion.equalsIgnoreCase("U")) {
            evento.setAprobadores(1);
        }
        if (evento.getOrigen().getFlujo().isValidaMonto()) {
            evento.setSiguienteMonto(Pasos.instancia().porClave(claveFlujo, clavePasoSigMonto));
        }
        if (descripcionCorta != null) {
            evento.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        dao.update(evento, usuario);
    }

    public void eliminar(String claveFlujo, String clavePaso, String claveEvento) throws DAOException {
        dao.deleteWhere("evfl_fluj_clave  = '" + claveFlujo.replace("'", "''") + "' \n"
                + "AND    evfl_pafl_origen = '" + clavePaso.replace("'", "''") + "' \n"
                + "AND    evfl_clave       = '" + claveEvento.replace("'", "''") + "'");
    }

    public List<Evento> todos() throws DAOException {
        return dao.selectAll();
    }

    public Evento primerDelFlujo(String claveFlujo) throws DAOException {
        try {
            List<Evento> ls = dao.selectPrimerEvento(claveFlujo.replace("'", "''"));
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Evento> delPaso(String claveFlujo, String clavePaso) throws DAOException {
        return dao.selectWhere("evfl_fluj_clave  = '" + claveFlujo.replace("'", "''") + "' \n"
                      + "AND    evfl_pafl_origen = '" + clavePaso.replace("'", "''") + "'");
    }

    public Evento porClave(String claveFlujo, String clavePaso, String claveEvento) throws DAOException {
        try {
            List<Evento> ls = dao.selectWhere("evfl_clave = '" + claveEvento.replace("'", "''") + "' \n"
                    + "AND evfl_pafl_origen = '" + clavePaso.replace("'", "''") + "' \n"
                    + "AND evfl_fluj_clave  = '" + claveFlujo.replace("'", "''") + "'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }
}
